package com.xiaotao.user.service.impl;


import com.xiaotao.common.domain.dto.Condition;
import com.xiaotao.common.exceptions.BizIllegalException;
import com.xiaotao.common.utils.SnowflakeIdGenerator;
import com.xiaotao.user.domain.dto.PageDTO;
import com.xiaotao.user.domain.dto.ProductDTO;
import com.xiaotao.user.domain.po.Product;
import com.xiaotao.user.domain.query.PageQuery;
import com.xiaotao.user.domain.vo.ProductListVO;
import com.xiaotao.user.enums.LabelStatus;
import com.xiaotao.user.mapper.ProductMapper;
import com.xiaotao.user.service.IProductService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class ProductServiceImpl implements IProductService {

    @Resource
    private ProductMapper productMapper;

    private final SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1); // 节点 ID 可根据实际情况调整


    @Override
    public List<ProductListVO> getProducts() {
        List<ProductListVO> productList = new ArrayList<>();
        productList = productMapper.getProducts();

        return productList;
    }

    /**
     * 根据分页查询对象获取产品列表
     *
     * @param query 分页查询对象，包含页码、页面大小、类别等信息
     * @return 返回一个包含产品列表的分页数据传输对象
     */
    @Override
    public PageDTO<ProductListVO> getProductsByPageDTO(PageQuery query) {
        // 获取页码
        Integer pageNo = query.getPageNo();
        // 获取页面大小
        Integer pageSize = query.getPageSize();
        // 获取产品类别
        String category = query.getCategory();

        // todo 条件筛选 根据标签筛选
        // 根据类别字符串获取标签状态对象
        LabelStatus labelStatus = LabelStatus.fromString(category);

        // 封装条件集合
        int currentPage = (pageNo - 1) * pageSize;
        Condition condition = new Condition(currentPage, pageSize);

        // 初始化产品列表
        List<ProductListVO> productList = productMapper.getProductsByPage(condition);
        if (productList == null || productList.isEmpty()) {
            throw new BizIllegalException("数据库中没有数据");
        }

        long total = productMapper.getCounts();
        // 返回包含总记录数、总页数和产品列表的分页数据传输对象
        return PageDTO.of(total, total / pageSize, productList);
    }

    @Override
    public void addProduct(ProductDTO dto) {
        //1.比对dto和po，查找缺失属性 productId
        //1.1 雪花算法生成productId
        long productId = idGenerator.nextId();

        //2.封装dto
        Product product = new Product();
        product.setProductId(productId);
        product.setName(dto.getName());
        product.setPrice(dto.getPrice());
        product.setDescription("");
        product.setImageUrl(dto.getImage_url());

        //TODO 捕获或者抛出异常
        //3.调用mapper层接口
        productMapper.addProduct(product);
    }


    @Override
    public int selectProductById(Long id) {
        return productMapper.selectProductById(id);
    }

    @Override
    public void deleteProduct(Long id) {
        //1.查询数据库，是否存在这条数据
        int count = selectProductById(id);
        if (count == 0) {
            throw new BizIllegalException("查询失败，未知id");
        }
        //2.删除数据
        //TODO 捕获或者抛出异常
        productMapper.deleteProduct(id);
    }
}
